package com.qianfeng.context;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import com.qianfeng.annos.SuiBian;

import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.net.URL;
import java.util.*;

/**
 * Created by Jackiechan on 2022/1/20/20:20
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class MyContext {

    private String basePackage;

    private Map<String, Object> objMap = new HashMap<>();

    private List<Class> allNeedCreateClass = new ArrayList<>();


    public Object getBean(String name) {
        return objMap.get(name);
    }

    public MyContext() {
    }

    public MyContext(String basePackage) throws Exception {
        this.basePackage = basePackage;
        String dir=".";
        String basePath = null;
        Enumeration<URL> base = getClass().getClassLoader().getResources(dir);
        while (base.hasMoreElements()) {
            URL url = base.nextElement();
            System.err.println(url);
            if ("file".equalsIgnoreCase(url.getProtocol())) {
                String filePath = url.getFile();
                File file = new File(filePath);
                basePath = file.getAbsolutePath();
            }
        }
       // String dir = basePackage.replace(".", "/");
        Enumeration<URL> resources = getClass().getClassLoader().getResources(dir);
        while (resources.hasMoreElements()) {
            URL url = resources.nextElement();
            System.err.println(url);
            if ("file".equalsIgnoreCase(url.getProtocol())) {
                //开始扫描这个目录下的所有的文件
                System.err.println("开始扫描文件了");
                String filePath = url.getFile();
                File file = new File(filePath);
                digui(file,basePath);
            }
        }

        allNeedCreateClass.parallelStream().forEach(alzss->{
            SuiBian suibian = (SuiBian) alzss.getAnnotation(SuiBian.class);
            if (suibian != null) {
                String value = suibian.value();
                String name = null;
                if ("".equalsIgnoreCase(value)) {
                    name = alzss.getSimpleName();
                    System.err.println(name);
                }else{
                    name = value;
                }
                try {
                    Object o = alzss.newInstance();
                    objMap.put(name, o);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }
        });
    }


    public void digui(File file,String basePath) throws Exception {
        File[] files = file.listFiles();
        if (files != null) {
            for (File file1 : files) {
                if (file1.isDirectory()) {
                    digui(file1,basePath);

                }else{
                    String absolutePath = file1.getAbsolutePath();
                    //System.err.println(absolutePath);
                    if (file1.getName().endsWith("class")) {
                        //是一个类
                        String classPath = absolutePath.replace(basePath, "").replace(".class", "");
                       // System.err.println(classPath);
                        if (classPath.startsWith(File.separator)) {
                           // System.err.println("queing");
                           // System.err.println(classPath.replace(File.separator, ""));
                            String realClassName = classPath.substring(classPath.indexOf(File.separator) + 1).replace(File.separator, ".");
                            System.err.println(realClassName);
                            Class<?> aClass = Class.forName(realClassName);
                            allNeedCreateClass.add(aClass);
                        }
                    }
                }
            }
        }
    }

}
